﻿using FluentNHibernate.Cfg;
using NHibernate;

namespace BAT.APT.NHDao.Main
{
    public class SessionFactory
    {
        public static ISessionFactory GetCurrentFactory()
        {
            if (sessionFactory == null)
            {
                sessionFactory = CreateSessionFactory();
            }
            return sessionFactory;
        }

        private static ISessionFactory CreateSessionFactory()
        {
            //1传统的创建方式，默认会找根目录下名称为hibernate.cfg.xml的文件
            //return new Configuration().Configure().BuildSessionFactory();

            //2fluent的方式配置传统配置方式，因为fluent只实现了mapping，所以需要饮用nh和flNH两个程序集的东西。
            //return Fluently.Configure(new NHibernate.Cfg.Configuration().Configure()).BuildSessionFactory();

            //3fluent调用外部配置文件中的文件,我在配置的时候发现，只要nh文件的属性是始终复制，他就会在bin文件中出现可以找到,然后就可以用了，所以不需要应用UI层
            return Fluently.Configure(new NHibernate.Cfg.Configuration().Configure("config/hibernate.cfg.xml"))//上面这是链接数据库用的
                .Mappings(m =>
                     m.FluentMappings
                        .AddFromAssembly(System.Reflection.Assembly.Load("BAT.APT.Domain")).ExportTo(@"E:\Mapping"))
                .BuildSessionFactory();

            //不需要外部文件，之用fluent就可以配置数据库驱动的信息等
            //return Fluently.Configure()
            //    .Database(
            //        FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005
            //            .ConnectionString(s => s.Server(".")
            //                   .Database("MyNHibernate")
            //                    .TrustedConnection())
            //   ).BuildSessionFactory();

            //return Fluently.Configure()
            //    .Database(
            //        FluentNHibernate.Cfg.Db.OracleClientConfiguration.Oracle10
            //            .
            //            //.ConnectionString(s => s.Server("")
            //                    .Database("User ID=apt;Password=pwd;Data Source=orcl")
            //                    //.TrustedConnection()
            //                    )
            //   ).BuildSessionFactory();


            //4sql数据库的映射方式
            //return Fluently.Configure()
            //.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c
            //.Server("xxx")
            //.Database("FluentNHibernateFirstSample")
            //.Password("xxxxx")))
            //.Mappings(m => m.FluentMappings.AddFromAssemblyOf<Program>())
            //.ExposeConfiguration(BuildSchema) // BuildSchema 红色字体提示
            //.BuildSessionFactory();
        }

        private static ISessionFactory sessionFactory
        {
            get;
            set;
        }
    }
}
